package br.unicamp.ic.inf312.arena.testeunitario.persistencia.dao;

import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;

import br.unicamp.ic.inf312.arena.modelo.artistico.Filme;
import br.unicamp.ic.inf312.arena.modelo.logistico.AgendaArtistica;
import br.unicamp.ic.inf312.arena.modelo.logistico.Assento;
import br.unicamp.ic.inf312.arena.modelo.logistico.Evento;
import br.unicamp.ic.inf312.arena.modelo.logistico.Sala;
import br.unicamp.ic.inf312.arena.modelo.logistico.UnidadeNegocio;
import br.unicamp.ic.inf312.arena.modelo.pessoa.Estudante;
import br.unicamp.ic.inf312.arena.modelo.vendas.Bilhete;
import br.unicamp.ic.inf312.arena.modelo.vendas.BilheteMeiaEntrada;
import br.unicamp.ic.inf312.arena.modelo.vendas.CartaoCredito;
import br.unicamp.ic.inf312.arena.modelo.vendas.Compra;
import br.unicamp.ic.inf312.arena.persistencia.dao.ICompraDAO;
import br.unicamp.ic.inf312.framework.persistencia.BeginPersistenceTransactionException;
import br.unicamp.ic.inf312.framework.persistencia.DataAccessObjectFactory;
import br.unicamp.ic.inf312.framework.teste.DAOBaseTestCase;
import br.unicamp.ic.inf312.framework.util.FrameworkUtil;

public class CompraDAOMySQLTest extends DAOBaseTestCase {
	private static final String PERSISTENCIA_PROPERTIES = "br/unicamp/ic/inf312/persistencia.properties";

	private static ICompraDAO daoCompra = null;

	/**
	 * setUp()
	 */
	protected void setUp() throws Exception {
		super.setUp();
		DataAccessObjectFactory.getInstance(PERSISTENCIA_PROPERTIES);
		daoCompra = (ICompraDAO) DataAccessObjectFactory
				.getImpl(ICompraDAO.class);
	}

	/**
	 * tearDown() 
	 */
	protected void tearDown() throws Exception {
		super.tearDown();
		daoCompra = null;
	}

	/**
	 * testObterCompra() 
	 */
	public void testObterCompra() {
		try {
			Compra compra = daoCompra.obter(01L);

			System.out.println("\t Compra: " + compra);
			assertNotNull(compra);
		}
		catch (SQLException sqlErr) {
			System.err.println(sqlErr.getMessage());
			assertFalse(true);
		}
		catch (Exception err) {
			System.err.println(err.getMessage());
			assertFalse(true);
		}
	}

	/**
	 * testObterProximoNumeroProtocolo() 
	 */
	public static void testObterProximoNumeroProtocolo() {
		try {
			long numProtocolo = daoCompra.obterProximoNumeroProtocolo();

			System.out.println("\t Numero Protocolo: " + numProtocolo);
			assertNotNull(numProtocolo);
		}
		catch (SQLException sqlErr) {
			System.err.println(sqlErr.getMessage());
			assertFalse(true);
		}
		catch (Exception err) {
			System.err.println(err.getMessage());
			assertFalse(true);
		}
	}

	/**
	 * testGravarCompra() 
	 */
	public static void testGravarCompra() {
		// try catch block TRANSACIONAL - DataAccessObjectFactory
		try {
			DataAccessObjectFactory.getInstance(PERSISTENCIA_PROPERTIES);
			daoCompra = (ICompraDAO) DataAccessObjectFactory
					.getImpl(ICompraDAO.class);

			DataAccessObjectFactory.beginPersistenceTransaction();
			// impl. da logica transacional
			long numProtocolo = daoCompra.obterProximoNumeroProtocolo();

			CartaoCredito pagto = new CartaoCredito(28, 09.27d,
					432187699999999l, "MasterCard");

			Estudante espectador = new Estudante("25903953883");

			Filme espetaculo = new Filme();
			espetaculo.setCodEspetaculo(1);

			Sala sala = new Sala();
			sala.setCodSala(1);
			sala.setCodunidade(1);

			UnidadeNegocio unidade = new UnidadeNegocio();
			unidade.setCodUnidade(1);

			AgendaArtistica agenda = new AgendaArtistica();
			agenda.setCodAgenda(1);
			agenda.setUnidadeNegocio(unidade);

			Evento evento = new Evento();
			evento.setCodEvento(1);
			evento.setQtdVagasLivre(2);
			evento.setValor(12.0d);
			evento.setEspetaculo(espetaculo);
			evento.setSala(sala);
			evento.setAgenda(agenda);

			Compra compra = new Compra(numProtocolo, FrameworkUtil
					.obterDataCorrenteSQL(), pagto, null);

			Assento assento = new Assento();
			assento.setCodigo(1);
			assento.setNumero(1);

			BilheteMeiaEntrada meiaEntrada = new BilheteMeiaEntrada(63l,
					BilheteMeiaEntrada.ESTADO_VENDIDO, espectador, evento,
					compra, assento, null);			

			Collection<Bilhete> bilhetes = new ArrayList<Bilhete>();
			bilhetes.add(meiaEntrada);

			compra.setBilhetes(bilhetes);
			
			daoCompra.inserir(compra);

			// efetiva transacao na base
			DataAccessObjectFactory.commitPersistenceTransaction();
		}
		catch (BeginPersistenceTransactionException beginError) {
			beginError.printStackTrace();
		}
		catch (SQLException sqlErr) {
			// logError(sqlErr.toString());
			// desfaz transacao na base
			sqlErr.printStackTrace();
			try {
				DataAccessObjectFactory.rollbackPersistenceTransaction();
			}
			catch (Exception e) {
				e.printStackTrace();
			}
		}
		catch (Exception err) {
			// logError(err.toString());
			// desfaz transacao na base
			err.printStackTrace();
			try {
				DataAccessObjectFactory.rollbackPersistenceTransaction();
			}
			catch (Exception e) {
				e.printStackTrace();
			}
		}
		finally {
			daoCompra = null;
		}
	}

	/**
	 * main(String[]) 
	 */
	public static void main(String[] args) {
	}
}